The advent of computer networks has led to the development of computer systems that perform computational operations on behalf of numerous client computer systems. These server systems are typically configured with large amounts of computing resources for processing concurrently executing computational workloads. One challenge in designing an operating system to manage such a server is to ensure that computer system resources are allocated between computational workloads so that the minimum requirements of each workload are satisfied, while executing the workloads in an efficient manner.
Some computing systems provide support for partitioning a machine-wide resource into smaller sets and then associating one or more workloads with each of the sets. In this way, the specific processes do not compete with other processes for access to the resource set. One shortcoming of the systems that provide the partitioning support is that the partitioning is static. Thus, to change the partitions for the resource pool is labor intensive and can require many hours of expensive system consultancy to optimize, as well as the operator's awareness of resource requirements for excepted workloads. Additionally, any optimizations from adjustment of the static partitions may turn out to be short-lived and fragile in the face of volatile workloads with the optimization turning into a long running ad-hoc process requiring a large amount of labor intensive intervention from skilled administrators.
Other operating systems have developed a mechanism for assembling a group of resources into a fixed “container” that processes can bind to in order to access the resources. However, resources within a fixed container cannot be flexibly changed over time to accommodate changing resource requirements for the various system workloads. Furthermore, due to the absence of a resource pool abstraction, there is no mechanism for multiplexing access to resources.